/**
 * # 数据实体类:
 *  OpMessage - 数据操作消息
 * 
 * # 描述:
 *  表示一条已经记录的数据操作日志消息。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.log.mop.data;

/**
 * 数据操作消息。
 * 
 * 表示一条已经记录的数据操作日志消息。
 */
public final class OpMessage extends pittypat.DataModel {
	/**
	 * 消息 Id。
	 * <p>
	 * 日志消息的 Id。
	 */
	public Long id;

	/**
	 * 用户 Id。
	 * <p>
	 * 进行数据操作的目标用户的 Id，如果是系统操作，则为 null。
	 */
	public java.util.UUID userId;

	/**
	 * 用户名称。
	 */
	public String userName;

	/**
	 * 操作类型代码。
	 * <p>
	 * 操作的类型代码：1-查询、2-添加、4-更新、8-删除、16-其他。
	 */
	public Byte opType;

	/**
	 * 操作时间。
	 * <p>
	 * 用户进行数据操作的时间。
	 */
	public java.time.LocalDateTime opTime;

	/**
	 * 数据库表名称。
	 * <p>
	 * 所操作的目标数据库表的名称，多个之间使用 ',' 分隔。
	 */
	public String tableNames;

	/**
	 * 存储过程名称。
	 * <p>
	 * 执行操作的存储过程或函数的名称。
	 */
	public String procName;

	/**
	 * 是否成功。
	 * <p>
	 * 指示操作是否已经成功。
	 */
	public Boolean success;

	/**
	 * 操作摘要。
	 * <p>
	 * 操作的摘要信息。
	 */
	public String summary;

	/**
	 * 初始化 OpMessage 类的一个新实例。
	 */
	public OpMessage() {
		super();

		// 消息 Id
		this.id = null;
		// 用户 Id
		this.userId = null;
		// 用户名称
		this.userName = null;
		// 操作类型代码
		this.opType = null;
		// 操作时间
		this.opTime = null;
		// 数据库表名称
		this.tableNames = null;
		// 存储过程名称
		this.procName = null;
		// 是否成功
		this.success = null;
		// 操作摘要
		this.summary = null;
	}

	/**
	 * 从一个 DbDataReader 中读取此对象。
	 * 
	 * @param reader
	 * 			包含对象数据的 DbDataReader 对象。
	 * 
	 * @throws IllegalArgumentException
	 * 
	 * @see pittypat.DataModel#read(pittypat.data.DbDataReader)
	 * @see pittypat.data.DbDataReader
	 */
	@Override
	public void read(pittypat.data.DbDataReader reader) throws IllegalArgumentException {
		if (reader == null) {
			throw new IllegalArgumentException("reader 为 null。");
		}

		// 消息 Id
		this.id = reader.getLong("id", this.id);
		// 用户 Id
		this.userId = reader.getUuid("userId", this.userId);
		// 用户名称
		this.userName = reader.getString("userName", this.userName);
		// 操作类型代码
		this.opType = reader.getByte("opType", this.opType);
		// 操作时间
		this.opTime = reader.getDateTime("opTime", this.opTime);
		// 数据库表名称
		this.tableNames = reader.getString("tableNames", this.tableNames);
		// 存储过程名称
		this.procName = reader.getString("procName", this.procName);
		// 是否成功
		this.success = reader.getBoolean("success", this.success);
		// 操作摘要
		this.summary = reader.getString("summary", this.summary);
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 * 
	 * @see pittypat.DataModel#write(java.io.Writer)
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// 消息 Id
		writer.write("\"id\":");
		pittypat.Json.write(writer, this.id);
		writer.write(',');

		// 用户 Id
		writer.write("\"userId\":");
		pittypat.Json.write(writer, this.userId);
		writer.write(',');

		// 用户名称
		writer.write("\"userName\":");
		pittypat.Json.write(writer, this.userName);
		writer.write(',');

		// 操作类型代码
		writer.write("\"opType\":");
		pittypat.Json.write(writer, this.opType);
		writer.write(',');

		// 操作时间
		writer.write("\"opTime\":");
		pittypat.Json.write(writer, this.opTime);
		writer.write(',');

		// 数据库表名称
		writer.write("\"tableNames\":");
		pittypat.Json.write(writer, this.tableNames);
		writer.write(',');

		// 存储过程名称
		writer.write("\"procName\":");
		pittypat.Json.write(writer, this.procName);
		writer.write(',');

		// 是否成功
		writer.write("\"success\":");
		pittypat.Json.write(writer, this.success);
		writer.write(',');

		// 操作摘要
		writer.write("\"summary\":");
		pittypat.Json.write(writer, this.summary);

		writer.write('}');
	}
}
